O arquivo Matter2013-London.csv, obtido em http://www.airqualityontario.com, contém informações sobre as concentrações de partículas inaláveis finas (MP\(_{2,5}\), em \(\mu g/m^{3}\) ), registradas no ano de 2013 em London, cidade situada na província canadense de Ontário. Os valores são registrados a cada hora. Para determinado dia D, as variáveis \(\textit{H}_{1}\) a \(\textit{H}_{24}\) representam as medições feitas na primeira até a \(24^{ª}\) hora do dia, respectivamente.
O objetivo é realizar uma análise exploratória desta série temporal dada por:
\[Y_{t} = min\{H_{j,t}\},\]
em que \(j = 1,...,24\) e \(H_{j,t}\) representa o valor de MP\(_{2,5}\) observado no dia \(t\) na hora \(H\).
Dados brutos antes do tratamento:
Dados após preparação:
Gráfico da série temporal \(Y_{t}\):
Plots da FAC e FACP:
O Gráfico da série não indica ausência de estacionariedade no que se refere a sua média. O gráfico da Função de Autocorrelação (FAC), com \(\rho(1) \sim 0.25\), corrobora a existência de estacionariedade na série.
OBS: optamos por não utilizar o teste de Dick-Fuller, devido às duas funções disponíveis no R para este fim estarem apresentando resultados discrepantes, mesmo com o devido ajuste das hipóteses alternativa e nula.
Com base no gráfico da FAC, a queda exponencial da autocorrelação nos primeiros lags parece indicar um modelo autorregressivo. A FACP, por sua vez, nos permite inferir a possível ordem deste modelo autorregressivo: como há apenas o lag \(1\) acima das bandas de confiança, sugere-se um modelo de filtro linear AR(1) (ou ARIMA(1,0,0)). A existência de outros lags com autocorrelações acima das bandas de confiança pode ser atribuída a ocorrência de erro tipo I ou valores espúrios devido a erro amostral.
Poder-se-ia, ainda, utilizar a função auto.arima() do pacote forecast para obter uma sugestão automática acerca do modelo de filtro linear para a série estacionária no caso. A utilização desta função, corrobora a sugestão de modelo que fizemos utilizando como base um análise exploratória:
## Series: matter3_ts
## ARIMA(1,0,0) with non-zero mean
##
## Coefficients:
## ar1 mean
## 0.2677 8.3267
## s.e. 0.0504 0.2826
##
## sigma^2 estimated as 15.75: log likelihood=-1020.04
## AIC=2046.09 AICc=2046.15 BIC=2057.78
O potencial Hidrogeniônico (pH) é uma variável importante no monitoramento da qualidade da água, uma vez que ele afeta o metabolismo de várias espécies aquáticas. De um modo geral, para a proteção da vida aquática, o pH deve estar entre 6 e 9. Tomou-se o conjunto de dados Potencial Hidrogeniônico (pH), obtido junto ao Departamento de Recursos Hídricos do Estado da California, EUA. A série histórica é constituída por 72.570 observações registradas a cada 15 minutos, de 9/mar/2012 a 9/jun/2014.
O objetivo é realizar uma análise exploratória desta série temporal dada por \(X_{t}\) no intraday.
Dados brutos antes do tratamento:
Dados após tratamento:
Plot da série temporal \(X_{t}\):
Plots da FAC e FACP:
No gráfico da Função de Autocorrelação (FAC/ACF), o fato de \(\rho(1) \sim 1\) implica um comportmento de quase passeio aleatório \((X_t \sim X_{t-1})\), indicando, assim, a inexistência de estacionariedade na série. Há também um decaimento bastante lento das correlações conforme se avança no tempo, com picos aparentemente cíclicos, o que também contribui para a violação das condições de estacionariedade. Portanto, é possível afirmar que a série em análise não é estacionária, sendo necessário realizar uma transformação nos dados.
Há algumas técnicas que podemos utilizar para transformar uma série não-estacionária em estacionária. Shumway & Stoffer (2011, pp. 45-47) enumeram: detrending por meio da remoção de uma posível tendência na série temporal; differenciating que consiste em fazer subtrações sucessivas da série sobre ela mesma em um ou mais períodos anteriores; e transformações como \(log(x_{t})\) e Box-Cox. Os próprios autores indicam que, se objetivo é obter a estacionariedade, a opção mais adequada é diferenciar a série. O mesmo propõe Moretin (2005, pp. 4-5), acrescentando ainda, que na maioria das vezes são necessárias apenas uma ou duas diferenças para tornar a série estacionária. Portanto, com base nestes argumentos, empregaremos a diferenciação de primeira ordem na série em questão.
Plot da série após primeira diferenciação:
Com base no gráfico acima, é possível dizer que a série não aponta claros indícios de comportamento não-estacionário, pelo menos com relação a sua média. No entanto, faremos os plots da FAC e FACP a fim de confirmar este resultado.
Plots da ACF e PACF:

Ainda com a diferenciação de primeira ordem na série, continua havendo um comportamento cíclico que viola os pressupostos de estacionariedade. Com isso, realizaremos mais uma diferenciação da série na tentativa de eliminar o padrão cíclico e obter estacionariedade.
Plot da série após segunda diferenciação:
Plots da FAC e FACP:

Com \(\rho(1) \le 0.5\) no lag \(1\) da Função de Autocorrelação, temos um forte indicativo de estacionariedade na série. Outros lags além de \(h=3\), cujos valores das autocorrelações por ventura ultrapassam as bandas de confiança, podem ser atribuídos ao percentual esperado de erro tipo I ou ser considerados valores espúrios devido ao erro amostral.
Com base na FAC da série original, claramente constata-se a existência de um ciclo na série. Pode-se dizer que os ciclos de correlações positivas e negativas se alternam a cada 50 lags aproximadamente. Levando em consideração que a série apresenta uma periodicidade intraday de 15 em 15 minutos, estes ciclos equivalem, em horas, a:
\[\frac {15 \times 50} {60} = 12.5\]
Portanto, temos ciclos de aproximadamente \(12\) horas nos dados, o que provavelmente indica variações de pH que ocorrem ao se alternar entre o período diurno e noturno de cada dia.
Tendo em vista a queda abrupta das correlações no gráfico da FAC, no qual temos os 3 primeiros lags com correlação acima das bandas de confiança, e com base também na FACP, que apresenta queda exponencial, sugere-se que se trata de um modelo de médias móveis ARIMA(0,2,3).
Os dados referem-se ao índice Dow Jones Industrial da Bolsa de Valores de Nova Iorque, de 18/9/2009 a 25/05/2010, dispostos numa periodicidade intraday de 1 minuto. As colunas do arquivo de dados, além das datas e dos horários, representam, respectivamente, abertura, máxima, mínima, fechamento e volume.
Dados brutos antes do tratamento:
Dados após preparação:
Plots das séries DJI:
Plots das FAC e FACP:





A partir dos gráficos das séries, podemos inferir que as séries de Abertura, Fechamento, Máxima e Mínima não aparentam ser estacionárias. Todas as séries, com exceção da série de volume, apresentam \(\rho(1) \sim 1\) - comportamento de random walk e decaimento extremamente lento na autocorrelação. Segundo Moretin (2005, p.8), o comportamento de passeio aleatório é inerente a maioria das séries financeiras.
Embora não tenha \(\rho(1) \sim 1\), a série do volume apresenta claramente comportamento cíclico a cada \(400\) lags (equivalente a cada 6 horas e meia aproximadamente), o que também acaba por violar o pressuposto de estacionariedade.
A fim de obter a estacionariedade das séries, utilizaremos novamente a diferenciação.
Plots das séries diferenciadas em 1ª ordem:
Plots das FAC e FACP das séries diferenciadas em 1ª ordem:
OBS: Vamos reduzir o número de lags dos gráficos das séries que não apresentaram ciclos e manteremos os \(5000\) lags no plot do volume para verificar se os ciclos foram eliminados:





Após tomarmos a primeira diferença das séries, se considerarmos que alguns picos nas correlações que ultrapassam as bandas de confiança são devido a valores espúrios de erro amostral ou erro tipo I, podemos assumir que todas as séries tornaram-se estacionárias, uma vez que \(\rho(1)\) apresenta valores bem abaixo de 1 nos gráficos e não há comportamento cíclico. A exceção fica apenas para a série de volume, a qual continua a apresentar picos de correlação a cada aproximadamente 400 lags, violando assim uma condição de estacionariedade. Por isso, tomaremos a segunda diferença apenas da série de volume a fim de obter a estacionariedade nesta série.
Plots da série volume com diferença de ordem 2:

Como ainda não conseguimos a estacionariedade, vamos utilizar a transformação logarítimica na série original do volume e depois aplicaremos novamente as 2 diferenciações. Optamos pela utilização da transformação Log por ser bastante utilizada ao se trabalhar com dados financeiros.
FAC e FACP da série log(volume):

FAC e FACP da série log(volume) com diferença de ordem 2:

Após aplicarmos a transformação Log na série original de volume, acompanhada de 2 diferenciações, aparentemente temos uma série estacionária, pois além de \(|\rho(1)| < 1\), praticamente eliminamos o comportamento cíclico das correlações, uma vez que eventuais picos não são tão significativos e podem ser consideradas como valores espúrios devido a erro amostral.
Um gráfico da FAC e FACP com menos lags ajudam a avaliá-las melhor, uma vez que já verificamos que não há mais comportamento cíclico:

Plots das séries:
Plots das FAC e FACP das novas séries:


série \(log(max/min)\):
A série em questão apresenta \(\rho(1)\) bem abaixo de 1, mas com um decaimento lento após este lag, o que indica ser um processo estacionário, mas de memória longa. Poderia ser tratado, portanto, como um processo autorregressivo de memória longa.
série \(log(fechamento/abertura)\):
A série \(log(fechamento/abertura)\) é estacionária, pois sua FAC apresenta \(\rho(1)\) bem abaixo de 1. Na verdade, o lag \(h=1\) aparenta ser o único acima das bandas de confiança da FAC. Por isso, essa série ser representada por um modelo de filtro linear. Neste caso, parece ser adequado um modelo o modelo MA(1) (ou ARIMA(0,0,1)).
SHUMWAY, R.H. & STOFFER, D.S. Time Series Analysis and Its Applications with R Examples, Springer, 2011.
MORETTIN, P.A. & TOLOI, C.M. Análise de Séries Temporais, 2 a ed., Edgard Blücher, 2005
R CORE TEAM. R: A language and environment for statistical computing. R Foundation for Statistical Computing, Vienna, Austria. URL https://www.R-project.org/.
# --------------- QUESTÃO 1
# ----- leitura e carregamento
library(tibbletime)
library(dplyr)
library(ggplot2)
library(readr)
library(lubridate)
library(reshape2)
matter.loc <- "/home/allan/Documents/1S2018/A_SERIES_TEMPORAIS/aulas/dados/Matter2013-London.csv"
matter <- read_csv(matter.loc)
# head(matter)
matter
# ----- data preparation
# passando para formato long;
# eliminando as duas primeiras colunas;
# eliminando os NA's e as entradas com 9999 e -999;
# agrupando por dia e calculando o minimo
matter2 <- matter %>%
dplyr::select(-(1:2)) %>% # eliminando duas primeiras colunas
melt(id.vars = "Date") %>% # to long
magrittr::set_colnames(c("Date", "hora", "MP")) %>%
dplyr::arrange(Date, hora) %>% # ordenar por dia/hora
mutate(MP = replace(MP, MP == 9999 | MP == -999, NA)) %>% # sol: https://stackoverflow.com/questions/35610437/using-dplyr-to-conditionally-replace-values-in-a-column
na.omit() %>%
group_by(Date) %>%
summarise(MP = as.numeric(min(MP, na.rm=TRUE))) # a serie eh baseada no minimo do dia
# nao precisamos das horas
# passando para tibble e tibbletime:
matter3 <- matter2 %>%
#tibble::as_tibble() %>%
#na.omit() %>% # eliminando os NA's
mutate(Date = lubridate::ymd(Date)) %>% # usando ymd do lubridate
as_tbl_time(index = Date)
# head(matter3)
matter3
# ----- plots serie:
# --- serie:
# ggplot:
# matter3 %>%
# ggplot() +
# geom_line(aes(x = Date, y = MP), colour="orange") +
# theme_minimal()+
# labs(title="Série diária de MP")
# dygraphs
library(dygraphs)
library(xts)
matter3_ts <- xts(matter3 %>% dplyr::select(MP), order.by=matter3$Date)
# dygraph(matter3_ts, elementId='matter3') %>% dyRangeSelector()# %>% dyUnzoom()
dygraph(matter3_ts, elementId='matter3', main="Série do mínimo diário da variável MP" ) %>% dyRangeSelector() %>% dyUnzoom() %>%
dySeries("MP", color = "orange", strokeWidth = 0.7)
# --- preparando o plot:
# funcoes para plotar ACF e PACF nos moldes do ggplot2
# adaptado de: https://stackoverflow.com/questions/42753017/adding-confidence-intervals-to-plotted-acf-in-ggplot2
gg_acf <- function(ts, title, lag.max){
ts_acf <- acf(ts, lag.max = lag.max, na.action = na.pass, plot=FALSE)
# conf <- 0.95
# conf_lims <- c(-1,1)*qnorm((1 + conf)/2)/sqrt(ts_acf$n.used)
# info do pofessor para bandas de confiança
conf_lims <- c(-1,1)*2/sqrt(ts_acf$n.used)
ts_acf$acf %>%
# tibble::as_tibble() %>% dplyr::mutate(lags = 0:(n()-1)) %>% # acf começa em zero e termina em n-1
tibble::as_tibble() %>% dplyr::mutate(lags = 0:(lag.max)) %>% # acf começa em zero e termina em lag.max
ggplot2::ggplot(aes(x=lags, y = V1)) + ggplot2::scale_x_continuous(breaks=seq(0,lag.max,lag.max/10)) +
ggplot2::geom_hline(yintercept=conf_lims, lty=2, col='red', size=0.3) +
ggplot2::labs(y="Autocorrelations", x="Lag", title=title) +
ggplot2::geom_segment(aes(xend=lags, yend=0)) + theme_minimal()
#+ ggplot2::geom_point()
}
gg_pacf <- function(ts, title, lag.max){
ts_pacf <- pacf(ts, lag.max = lag.max, na.action = na.pass, plot=FALSE)
# corrigindo no zero:
ts_pacf$acf <- c("0"=1, ts_pacf$acf)
# conf <- 0.95
# conf_lims <- c(-1,1)*qnorm((1 + conf)/2)/sqrt(ts_pacf$n.used)
# info do pofessor para bandas de confiança
conf_lims <- c(-1,1)*2/sqrt(ts_pacf$n.used)
ts_pacf$acf %>% # tb eh acf o objeto dentro do output de pacf
# tibble::as_tibble() %>% dplyr::mutate(lags = 1:n()) %>% # pacf começa em 1 e termina em n
tibble::as_tibble() %>% magrittr::set_colnames(c("V1")) %>% # para funcionar apos a inclusao do zero
dplyr::mutate(lags = 0:(lag.max)) %>% # acf começa em zero e termina em lag.max
ggplot2::ggplot(aes(x=lags, y = V1)) + ggplot2::scale_x_continuous(breaks=seq(0,lag.max,lag.max/10)) +
ggplot2::geom_hline(yintercept=conf_lims, lty=2, col='red', size=0.3) +
ggplot2::labs(y="Partial Autocorrelations", x="Lag", title=title) +
ggplot2::geom_segment(aes(xend=lags, yend=0)) + theme_minimal()
#+ ggplot2::geom_point()
}
# ----- plots:
# par(mfrow=c(1,2))
# acf(matter3_ts)
# pacf(matter3_ts)
library(gridExtra)
# grid.arrange(gg_acf(matter3_ts), gg_pacf(matter3_ts), ncol=2)
grid.arrange(gg_acf(matter3_ts, "FAC", lag.max=100), gg_pacf(matter3_ts, "FACP", lag.max=100))
# # Augmented Dick-Fuller Test for Stationarity
# tseries::adf.test(matter3_ts, alternative="explosive", k=50)
# # aTSA:::adf.test(matter3_ts, nlag=50, output = FALSE)
forecast::auto.arima(matter3_ts)
# --------------- QUESTÃO 2
# ----- leitura e carregamento
library(tibbletime)
library(dplyr)
library(ggplot2)
library(readr)
library(lubridate)
library(reshape2)
ph2012.loc <- "/home/allan/Documents/1S2018/A_SERIES_TEMPORAIS/aulas/dados/pH2012.CSV"
ph2013.loc <- "/home/allan/Documents/1S2018/A_SERIES_TEMPORAIS/aulas/dados/pH2013.CSV"
ph2014.loc <- "/home/allan/Documents/1S2018/A_SERIES_TEMPORAIS/aulas/dados/pH2014.CSV"
ph2012 <- read_csv(ph2012.loc)
ph2013 <- read_csv(ph2013.loc)
ph2014 <- read_csv(ph2014.loc)
# juntando
ph <- bind_rows(ph2012, ph2013, ph2014)
# head(ph)
ph
# ----- data preparation
# convertendo para tibble time (serie temporal)
# library(lubridate)
ph2 <- ph %>%
dplyr::select(-Qual) %>%
mutate(Date = lubridate::mdy_hm(Date)) %>% # usando mdy_hm do lubridate
as_tbl_time(index = Date)
# filtrando
# # nao precisa - vamos usar toda a serie
# ph2 <- ph %>%
# filter_time('start' ~ 'end')
# head(ph2)
ph2
# ----- plots serie:
# --- serie intraday 15 min:
# ph2 %>%
# ggplot(aes(x = Date, y = Point, colour="coral2")) +
# geom_line() +
# theme_minimal()+
# labs(title="Série intraday (15 minutos) da variável Point")
# rCharts:
# library(rCharts)
# library(rjson)
# dPlot(MP ~ Date, data = matter3, type="line")
# dygraphs
library(dygraphs)
library(xts)
ph2_ts <- xts(ph2 %>% dplyr::select(Point), order.by=ph2$Date)
dygraph(ph2_ts, elementId='ph2', main="Série intraday (15 minutos) da variável Point" ) %>% dyRangeSelector() %>% dyUnzoom() %>%
dySeries("Point", color = "blue", strokeWidth = 0.5)
# ----- plots:
# par(mfrow=c(1,2))
# acf(ph2_ts)
# pacf(ph2_ts)
library(gridExtra)
grid.arrange(gg_acf(ph2_ts, "FAC", lag.max=1000), gg_pacf(ph2_ts, "FACP", lag.max=1000))
# # Augmented Dick-Fuller Test for Stationarity
# tseries::adf.test(ph2_ts, alternative="explosive", k=50)
# # aTSA:::adf.test(log_max_min_ts, nlag=100, output = TRUE)
# ----- diferenciacoes:
# ph2_diff <- ph2 %>%
# mutate(Point = diff(Point ~ Date[-1]))
#
# ph2_diff <- ph2 %>%
# mutate(Point = diff(Point))
ph2_ts_diff <- diff(ph2_ts)
# str(ph2_ts_diff)
# tibble::as.tibble(head((ph2_ts_diff)))
grid.arrange(gg_acf(ph2_ts_diff, "FAC", lag.max=1000), gg_pacf(ph2_ts_diff, "FACP", lag.max=1000))
ph2_ts_diff <- diff(ph2_ts_diff)
# str(ph2_ts_diff)
# tibble::as.tibble(head((ph2_ts_diff)))
dygraph(ph2_ts_diff, elementId='ph2_diff2', main="Série diferenciada de 2ª ordem da variável Point" ) %>% dyRangeSelector() %>% dyUnzoom() %>%
dySeries("Point", color = "blue", strokeWidth = 0.3)
grid.arrange(gg_acf(ph2_ts_diff, "FAC", lag.max=50), gg_pacf(ph2_ts_diff, "FACP", lag.max=50))
# --------------- QUESTÃO 3
# ----- leitura e carregamento
library(tibbletime)
library(dplyr)
library(ggplot2)
library(readr)
library(lubridate)
library(reshape2)
DJI.loc <- "/home/allan/Documents/1S2018/A_SERIES_TEMPORAIS/aulas/dados/DJI1MIN.txt"
# help(read_table)
DJI <- read_table2(DJI.loc, col_names = FALSE)
# head(DJI)
DJI
# ----- data preparation
DJI2 <- DJI %>%
dplyr::select(-1) %>% # eliminando primeira coluna
magrittr::set_colnames(c("Date", "hora", "open", "max", "min", "close", "vol")) %>%
#dplyr::arrange(Date, hora) %>% # ordenar por dia/hora
na.omit() %>%# removendo os NA's
dplyr::mutate(Date = paste(Date, hora, sep = " ")) %>% # colando hora na coluna Date
dplyr::select(- hora) #%>% # eliminado a coluna da hora
# dplyr::mutate(vol = log(vol))
# passando para tibble e tibbletime:
DJI3 <- DJI2 %>%
#tibble::as_tibble() %>%
#na.omit() %>% # eliminando os NA's
mutate(Date = lubridate::dmy_hms(Date)) %>% # usando ymd do lubridate
as_tbl_time(index = Date)
# head(DJI3)
DJI3
# ----- plots serie:
# dygraphs
library(dygraphs)
library(xts)
# volume eh mto alto e acaba dominando a serie, por isso, precisa ser separado
DJI3_ts <- xts(DJI3 %>% dplyr::select(open, max, min, close, vol), order.by=DJI3$Date)
# separando as series
series <- c("open_ts", "max_ts", "min_ts", "close_ts", "vol_ts")
for(j in 1:5){
assign(series[j], DJI3_ts[,j])
}
# 1 plot dygraphs para cada serie
p1 <- dygraphs::dygraph(open_ts, group="DJI", main="Abertura") %>% dySeries("open", strokeWidth = 0.5, color="orange")
p2 <- dygraphs::dygraph(max_ts, group="DJI", main="Máxima") %>% dySeries("max", strokeWidth = 0.5, color="red")
p3 <- dygraphs::dygraph(min_ts, group="DJI", main="Mínima") %>% dySeries("min", strokeWidth = 0.5, color="green")
p4 <- dygraphs::dygraph(close_ts, group="DJI", main="Fechamento") %>% dySeries("close", strokeWidth = 0.5, color="blue")
p5 <- dygraphs::dygraph(vol_ts, group="DJI", main="Volume") %>% dySeries("vol", strokeWidth = 0.5, color="purple")
p1
p2
p3
p4
p5
grid.arrange(gg_acf(open_ts, "FAC abertura", lag.max=1000), gg_pacf(open_ts,"FACP abertura", lag.max=1000))
grid.arrange(gg_acf(min_ts, "FAC mínima", lag.max=1000), gg_pacf(min_ts, "FACP mínima", lag.max=1000))
grid.arrange(gg_acf(max_ts, "FAC máxima", lag.max=1000), gg_pacf(max_ts, "FACP máxima", lag.max=1000))
grid.arrange(gg_acf(close_ts, "FAC fechamento", lag.max=1000), gg_pacf(close_ts, "FACP fechamento", lag.max=101))
grid.arrange(gg_acf(vol_ts, "FAC volume", lag.max=5000), gg_pacf(vol_ts, "FACP volume", lag.max=5000))
# ----- diferenciacoes
open_ts_diff <- diff(open_ts)
max_ts_diff <- diff(max_ts)
min_ts_diff <- diff(min_ts)
close_ts_diff <- diff(close_ts)
vol_ts_diff <- diff(vol_ts)
# 1 plot dygraphs para cada serie
p1_diff <- dygraphs::dygraph(open_ts_diff, group="DJI_diff", main="Abertura - diferenciada") %>% dySeries("open", strokeWidth = 0.5, color="orange")
p2_diff <- dygraphs::dygraph(max_ts_diff, group="DJI_diff", main="Máxima - diferenciada") %>% dySeries("max", strokeWidth = 0.5, color="coral")
p3_diff <- dygraphs::dygraph(min_ts_diff, group="DJI_diff", main="Mínima - diferenciada") %>% dySeries("min", strokeWidth = 0.5, color="green")
p4_diff <- dygraphs::dygraph(close_ts_diff, group="DJI_diff", main="Fechamento - diferenciada") %>% dySeries("close", strokeWidth = 0.5, color="blue")
p5_diff <- dygraphs::dygraph(vol_ts_diff, group="DJI_diff", main="Fechamento - diferenciada") %>% dySeries("vol", strokeWidth = 0.5, color="purple")
p1_diff
p2_diff
p3_diff
p4_diff
p5_diff
grid.arrange(gg_acf(open_ts_diff, "FAC abertura - diff", lag.max=50), gg_pacf(open_ts_diff,"FACP abertura - diff", lag.max=50))
grid.arrange(gg_acf(min_ts_diff, "FAC mínima - diff", lag.max=50), gg_pacf(min_ts_diff, "FACP mínima - diff", lag.max=50))
grid.arrange(gg_acf(max_ts_diff, "FAC máxima - diff", lag.max=50), gg_pacf(max_ts_diff, "FACP máxima - diff", lag.max=50))
grid.arrange(gg_acf(close_ts_diff, "FAC fechamento - diff", lag.max=50), gg_pacf(close_ts_diff, "FACP fechamento - diff", lag.max=50))
grid.arrange(gg_acf(vol_ts_diff, "FAC volume - diff", lag.max=500), gg_pacf(vol_ts_diff, "FACP volume", lag.max=5000))
vol_ts_diff <- diff(vol_ts_diff)
# 1 plot dygraphs para cada serie
p5_diff <- dygraphs::dygraph(vol_ts_diff, group="DJI_diff2", main="Volume - segunda diferenciada") %>% dySeries("vol", strokeWidth = 0.5, color="purple")
p5_diff
grid.arrange(gg_acf(vol_ts_diff, "FAC volume", lag.max=5000), gg_pacf(vol_ts_diff, "FACP volume", lag.max=5000))
grid.arrange(gg_acf(vol_ts_diff, "FAC volume", lag.max=50), gg_pacf(vol_ts_diff, "FACP volume", lag.max=50))
# transformacao log
# vol_ts_box <- forecast::BoxCox(vol_ts, lambda = 0.2)
# vol_ts_box <- forecast::BoxCox(vol_ts, lambda = 0.9)
vol_ts_log <- log(vol_ts)
grid.arrange(gg_acf(vol_ts_log, "FAC Log volume", lag.max=5000), gg_pacf(vol_ts_log, "FACP Log volume", lag.max=5000))
vol_ts_log_diff <- diff(vol_ts_log)
vol_ts_log_diff <- diff(vol_ts_log_diff)
# item ii)
# ----- data preparation
DJI4 <- DJI3 %>%
dplyr::mutate(log_max_min = log(max/min), log_close_open = log(close/open)) %>%
dplyr::select(Date, log_max_min, log_close_open)
# nao podemos usar transmute pq precisamos de Date tb
head(DJI4)
# ----- plots serie:
# dygraphs
library(dygraphs)
library(xts)
# volume eh mto alto e acaba dominando a serie, por isso, precisa ser separado
DJI4_ts <- xts(DJI4 %>% dplyr::select(log_max_min, log_close_open), order.by=DJI4$Date)
# separando as series
series_log <- c("log_max_min_ts", "log_close_open_ts")
for(j in 1:length(series_log)){
assign(series_log[j], DJI4_ts[,j])
}
# 1 plot dygraphs para cada serie
p1_log <- dygraphs::dygraph(log_max_min_ts, group="Log", main="log(max/min)$") %>% dySeries("log_max_min", strokeWidth = 0.5, color="orange")
p2_log <- dygraphs::dygraph(log_close_open_ts, group="Log", main="log(close/open)") %>% dySeries("log_close_open", strokeWidth = 0.5, color="red")
p1_log
p2_log
grid.arrange(gg_acf(log_max_min_ts, "FAC log(max/min)", lag.max=50), gg_pacf(log_max_min_ts,"FACP log(max/min)", lag.max=50))
grid.arrange(gg_acf(log_close_open_ts, "FAC log(close/open)", lag.max=50), gg_pacf(log_close_open_ts, "FACP log(close/open)", lag.max=50))
# # Augmented Dick-Fuller Test for Stationarity
# tseries::adf.test(log_max_min_ts, alternative="explosive", k=50)
# # aTSA:::adf.test(log_max_min_ts, nlag=100, output = TRUE)